# 逻辑运算符
"""
且 and 等价于 && 短路与
或 or  等价于 || 短路或
非 not 等价于 !  非运算
"""

# 短路逻辑 从左往右只有当第一个操作数的值无法确定逻辑运算结果时才对第二个操作数进行求值
# 例如
print(3 and 4)  # 4 左操作数为True 需要继续判断右 右为真输出4
print(3 and 0)  # 4 左操作数为True 需要继续判断右 右为假输出0
print(0 and 4)  # 0 左操作数为False 不继续判断右 直接输出0
print(3 or 4)  # 3 左操作数为True 不继续判断右 直接输出3
print(0 or 4)  # 4 左操作数为False 需要继续判断右 右为真输出4

# 有一个复杂的运算式
flag = (not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
# not 1 是 False
# 0 and 1 是 0 为 假
# 3 and 4 是 4 为 真
# 5 and 6 是 6 为 真
# 7 and 8 and 9 是 9 为 真
# 接下来 False or 0 or 4 or 6 or 9 从左往右输出第一个非零的操作数 4
print(flag)  # 4

# 运算符之间是有优先级的
# 上面式子去掉小括号
flag = not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9
# 先 not 再 and 再 or
# 等价于
# False or 0 or 4 or 6 or 9
# 跟上边一样了
print(flag)  # 4

# 补充常用的运算的优先级
"""
由上至下优先级越来越低
** 指数
*、@、/、//、% 乘法 矩阵乘法 除法 地板除 取余(取模与取余在0和证书是一样的结果)
<<、>> 移位运算符
& 大于 ^ 大于 | 分别是按位与、按位异或、按位或
in、not in(成员测试)、is、is not(同一性测试)、<、<=、>、>=、==、!=(比较)
not 大于 and 大于 or
if-else 条件表达式
lambda lambda表达式  
"""
